#!/bin/bash
# 系统监控脚本

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'

# 获取系统信息
get_system_info() {
    echo -e "${CYAN}=== 系统信息 ===${NC}"
    echo "时间: $(date)"
    echo "主机: $(hostname)"
    echo "系统: $(uname -s) $(uname -r)"
    echo "架构: $(uname -m)"
    echo ""
}

# 获取Docker服务状态
get_docker_status() {
    echo -e "${CYAN}=== Docker服务状态 ===${NC}"
    
    if docker-compose ps &> /dev/null; then
        docker-compose ps
    else
        echo -e "${RED}Docker Compose服务未运行${NC}"
    fi
    echo ""
}

# 获取资源使用情况
get_resource_usage() {
    echo -e "${CYAN}=== 资源使用情况 ===${NC}"
    
    # CPU使用率
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | sed 's/%us,//')
    echo -e "CPU使用率: ${GREEN}${CPU_USAGE}%${NC}"
    
    # 内存使用情况
    MEMORY_INFO=$(free -h | grep Mem)
    MEMORY_USED=$(echo $MEMORY_INFO | awk '{print $3}')
    MEMORY_TOTAL=$(echo $MEMORY_INFO | awk '{print $2}')
    MEMORY_PERCENT=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100.0}')
    echo -e "内存使用: ${GREEN}${MEMORY_USED}/${MEMORY_TOTAL} (${MEMORY_PERCENT}%)${NC}"
    
    # 磁盘使用情况
    echo "磁盘使用:"
    df -h | grep -E '^/dev/' | while read line; do
        USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
        MOUNT=$(echo $line | awk '{print $6}')
        if [ "$USAGE" -gt 80 ]; then
            echo -e "  ${RED}${line}${NC}"
        elif [ "$USAGE" -gt 60 ]; then
            echo -e "  ${YELLOW}${line}${NC}"
        else
            echo -e "  ${GREEN}${line}${NC}"
        fi
    done
    echo ""
}

# 获取容器资源使用
get_container_stats() {
    echo -e "${CYAN}=== 容器资源使用 ===${NC}"
    
    if docker ps --format "table {{.Names}}" | grep -q mysql-kwdb; then
        docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"
    else
        echo -e "${YELLOW}没有运行中的迁移工具容器${NC}"
    fi
    echo ""
}

# 获取日志统计
get_log_stats() {
    echo -e "${CYAN}=== 日志统计 ===${NC}"
    
    LOG_DIR="./logs"
    if [ -d "$LOG_DIR" ]; then
        echo "日志目录大小: $(du -sh $LOG_DIR | cut -f1)"
        echo "日志文件数量: $(find $LOG_DIR -name "*.log" | wc -l)"
        
        # 最近的错误日志
        if find $LOG_DIR -name "*.log" -exec grep -l "ERROR" {} \; | head -1 > /dev/null 2>&1; then
            ERROR_COUNT=$(find $LOG_DIR -name "*.log" -exec grep -c "ERROR" {} \; 2>/dev/null | awk '{sum+=$1} END {print sum}')
            echo -e "错误日志数量: ${RED}${ERROR_COUNT:-0}${NC}"
        else
            echo -e "错误日志数量: ${GREEN}0${NC}"
        fi
    else
        echo -e "${YELLOW}日志目录不存在${NC}"
    fi
    echo ""
}

# 获取迁移任务统计
get_migration_stats() {
    echo -e "${CYAN}=== 迁移任务统计 ===${NC}"
    
    OUTPUT_DIR="./output"
    REPORTS_DIR="./reports"
    
    if [ -d "$OUTPUT_DIR" ]; then
        COMPLETED_MIGRATIONS=$(find $OUTPUT_DIR -name "*_kwdb.sql" | wc -l)
        echo -e "已完成迁移: ${GREEN}${COMPLETED_MIGRATIONS}${NC}"
        
        # 最近的迁移
        LATEST_MIGRATION=$(find $OUTPUT_DIR -name "*_kwdb.sql" -printf '%T@ %p\n' 2>/dev/null | sort -n | tail -1 | cut -d' ' -f2-)
        if [ -n "$LATEST_MIGRATION" ]; then
            LATEST_TIME=$(stat -c %y "$LATEST_MIGRATION" 2>/dev/null | cut -d'.' -f1)
            echo "最近迁移: $(basename "$LATEST_MIGRATION") ($LATEST_TIME)"
        fi
    else
        echo -e "${YELLOW}输出目录不存在${NC}"
    fi
    
    if [ -d "$REPORTS_DIR" ]; then
        REPORT_COUNT=$(find $REPORTS_DIR -name "*.md" -o -name "*.json" | wc -l)
        echo -e "生成报告: ${GREEN}${REPORT_COUNT}${NC}"
    fi
    echo ""
}

# 健康检查
health_check() {
    echo -e "${CYAN}=== 健康检查 ===${NC}"
    
    # 检查Docker服务
    if systemctl is-active --quiet docker; then
        echo -e "Docker服务: ${GREEN}运行中${NC}"
    else
        echo -e "Docker服务: ${RED}未运行${NC}"
    fi
    
    # 检查容器健康状态
    if docker-compose ps | grep -q "Up (healthy)"; then
        echo -e "容器健康状态: ${GREEN}健康${NC}"
    elif docker-compose ps | grep -q "Up"; then
        echo -e "容器健康状态: ${YELLOW}运行中（未知健康状态）${NC}"
    else
        echo -e "容器健康状态: ${RED}未运行${NC}"
    fi
    
    # 检查端口
    if netstat -tuln | grep -q ":8080"; then
        echo -e "API端口8080: ${GREEN}监听中${NC}"
    else
        echo -e "API端口8080: ${YELLOW}未监听${NC}"
    fi
    echo ""
}

# 显示实时监控
real_time_monitor() {
    echo -e "${BLUE}开始实时监控（按Ctrl+C退出）...${NC}"
    echo ""
    
    while true; do
        clear
        echo -e "${BLUE}🔍 MySQL到KWDB迁移工具 - 实时监控${NC}"
        echo "========================================"
        
        get_system_info
        get_docker_status
        get_resource_usage
        get_container_stats
        get_log_stats
        get_migration_stats
        health_check
        
        echo -e "${BLUE}刷新时间: $(date) | 下次刷新: 30秒后${NC}"
        sleep 30
    done
}

# 生成监控报告
generate_report() {
    REPORT_FILE="monitoring_report_$(date +%Y%m%d_%H%M%S).txt"
    
    echo "生成监控报告: $REPORT_FILE"
    
    {
        echo "MySQL到KWDB迁移工具监控报告"
        echo "生成时间: $(date)"
        echo "========================================"
        echo ""
        
        get_system_info
        get_docker_status
        get_resource_usage
        get_container_stats
        get_log_stats
        get_migration_stats
        health_check
        
    } > "$REPORT_FILE"
    
    echo -e "${GREEN}监控报告已保存: $REPORT_FILE${NC}"
}

# 显示帮助信息
show_help() {
    echo "MySQL到KWDB迁移工具监控脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  --real-time, -r    实时监控模式"
    echo "  --report, -R       生成监控报告"
    echo "  --status, -s       显示当前状态"
    echo "  --help, -h         显示帮助信息"
    echo ""
    echo "示例:"
    echo "  $0                 显示当前状态"
    echo "  $0 --real-time     开始实时监控"
    echo "  $0 --report        生成监控报告"
}

# 主函数
main() {
    case "${1:-status}" in
        --real-time|-r)
            real_time_monitor
            ;;
        --report|-R)
            generate_report
            ;;
        --status|-s|status)
            get_system_info
            get_docker_status
            get_resource_usage
            get_container_stats
            get_log_stats
            get_migration_stats
            health_check
            ;;
        --help|-h|help)
            show_help
            ;;
        *)
            echo -e "${RED}未知选项: $1${NC}"
            show_help
            exit 1
            ;;
    esac
}

# 运行主函数
main "$@"
